/*
* Simbad - Robot Simulator
* Copyright (C) 2004 Louis Hugues
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
-----------------------------------------------------------------------------
* $Author: sioulseuguh $
* $Date: 2005/08/07 12:24:56 $
* $Revision: 1.14 $
* $Source: /cvsroot/simbad/src/simbad/gui/Simbad.java,v $
*/
package simbad.gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import simbad.demo.DemoManager;
import simbad.sim.Agent;
import simbad.sim.EnvironmentDescription;
import simbad.sim.SimpleAgent;
import simbad.sim.Simulator;
import simbad.sim.World;
//import javax.swing.UIManager;
/**
* This is the Simbad application mainframe.
*
*/
public class Simbad extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
static final String version="1.4";
static int SIZEX = 800;
static int SIZEY = 700;
JMenuBar menubar;
JDesktopPane desktop;
WorldWindow worldWindow=null;
ControlWindow controlWindow=null;
World world;
Simulator simulator;
Console console=null;
AgentInspector agentInspector=null;
boolean backgroundMode;
static Simbad simbadInstance=null;
/** Construct Simbad application with the given environement description */
public Simbad(EnvironmentDescription ed, boolean backgroundMode) {
super("Simbad - version "+ version);
simbadInstance = this;
this.backgroundMode = backgroundMode;
desktop = new JDesktopPane();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(SIZEX, SIZEY);
createGUI();
start(ed);
setVisible(true);
}
/** Create the main GUI. Only called once.*/
private void createGUI() {
desktop.setFocusable(true);
getContentPane().add(desktop);
menubar = new JMenuBar();
menubar.add(DemoManager.createMenu(this));
setJMenuBar(menubar);
}
/** Starts (or Restarts after releaseRessources) the world and simulator.*/
private void start(EnvironmentDescription ed){
System.out.println("Starting environmentDescription: "+ed.getClass().getName());
world = new World(ed);
simulator = new Simulator(desktop, world, ed);
createInternalFrames();
if (backgroundMode) {
runBackgroundMode();
}
}
/** Release all ressources. */
private void releaseRessources(){
simulator.dispose();
world.dispose();
disposeInternalFrames();
}
/**
* Creates the windows as Swing InternalFrames
*/
private void createInternalFrames() {
worldWindow = new WorldWindow(world);
desktop.add(worldWindow);
worldWindow.show();
worldWindow.setLocation(300, 20);
agentInspector = createAgentInspector(simulator, 20, 20);
if (!backgroundMode){
controlWindow = new ControlWindow(world, simulator);
desktop.add(controlWindow);
controlWindow.show();
controlWindow.setLocation(300, 450);
}
}
/**
* Dispose the windows- used before restart.
*/
private void disposeInternalFrames() {
simulator.dispose();
worldWindow.dispose();
if (agentInspector != null) agentInspector.dispose();
if (controlWindow != null){
controlWindow.dispose();
}
}
/**
* creates agent inspector window
*/
private AgentInspector createAgentInspector(Simulator simulator, int x,
int y) {
ArrayList<SimpleAgent> agents = simulator.getAgentList();
SimpleAgent a = ((SimpleAgent) agents.get(0));
if (a instanceof Agent) {
AgentInspector ai = new AgentInspector((Agent) a, !backgroundMode,simulator);
desktop.add(ai);
ai.show();
ai.setLocation(x, y);
return ai;
} else
return null;
}
public void actionPerformed(ActionEvent event) {
if (event.getActionCommand()=="demo"){
releaseRessources();
start( DemoManager.getDemoFromActionEvent(event));
}
}
/**
* Runs Simbad in background mode for computation intensive application.
* Minimize graphic display and renderer computation.
*/
private void runBackgroundMode(){
//TODO pb with collision , pb with camera in this mode.
setTitle(this.getTitle()+" - Background Mode");
System.out.println("---------------------------------------------");
System.out.println("Simbad is running in 'Background Mode");
System.out.println("World is rendered very rarely. UI is disabled");
System.out.println("--------------------------------------------");
// slow down
agentInspector.setFramesPerSecond(0.5f);
// Show a small indication window
JInternalFrame frame = new JInternalFrame();
JPanel p = new JPanel();
p.add(new JLabel("BACKGROUND MODE"));
frame.setContentPane(p); frame.setClosable(false);
frame.pack();frame.setLocation(SIZEX/2,SIZEY*3/4);
desktop.add(frame);
frame.show();
world.changeViewPoint(World.VIEW_FROM_TOP,null);
// start
simulator.startBackgroundMode();
}
/** The simbad main. Process command line arguments and launch simbad.*/
public static void main(String[] args) {
// process options
boolean backgroundMode = false;
for (int i = 0; i < args.length;i++)
{
if ("-bg".compareTo(args[i])==0) backgroundMode = true;
}
// Check java3d presence
try {
Class.forName("javax.media.j3d.VirtualUniverse");
} catch (ClassNotFoundException e1) {
JOptionPane.showMessageDialog(null, "Simbad requires Java 3D", "Simbad 3D",JOptionPane.ERROR_MESSAGE);
System.exit(-1);
}
//request antialising
System.setProperty("j3d.implicitAntialiasing", "true");
new Simbad(new simbad.demo.BaseDemo() ,backgroundMode);
}
public JDesktopPane getDesktopPane() {
return desktop;
}
/////////////////////////
// Class methods
public static Simbad getSimbadInstance() {
return simbadInstance;
}
}